home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / boot / netBoot.new / tftp.cpp < prev    next >
C/C++ Source or Header  |  1990-12-19  |  28KB  |  2,683 lines

  1. # 1 "tftp.c"
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11. # 1 "boot.h"
  12.  
  13.  
  14.  
  15.  
  16.  
  17.  
  18.  
  19.  
  20.  
  21.  
  22.  
  23.  
  24.  
  25.  
  26.  
  27.  
  28.  
  29.  
  30.  
  31.  
  32. # 1 "sun3.md/sunromvec.h"
  33.  
  34.  
  35.  
  36.  
  37.  
  38.  
  39.  
  40.  
  41.  
  42.  
  43.  
  44.  
  45.  
  46.  
  47.  
  48.  
  49.  
  50.  
  51.  
  52.  
  53.  
  54.  
  55.  
  56.  
  57.  
  58.  
  59.  
  60.  
  61.  
  62.  
  63.  
  64.  
  65.  
  66.  
  67.  
  68.  
  69.  
  70.  
  71.  
  72.  
  73.  
  74.  
  75.  
  76.  
  77.  
  78.  
  79.  
  80.  
  81.  
  82. struct sunromvec {
  83.     char        *v_initsp;         
  84.     void        (*v_startmon)();     
  85.     int        *v_diagberr;         
  86.  
  87.  
  88.     struct bootparam    **v_bootparam;     
  89.      unsigned    *v_memorysize;         
  90.  
  91.  
  92.     unsigned char    (*v_getchar)();         
  93.     void        (*v_putchar)();         
  94.     int        (*v_mayget)();         
  95.     int        (*v_mayput)();         
  96.     unsigned char    *v_echo;         
  97.     unsigned char    *v_insource;         
  98.     unsigned char    *v_outsink;         
  99.  
  100.  
  101.     int        (*v_getkey)();         
  102.     void        (*v_initgetkey)();     
  103.     unsigned int    *v_translation;         
  104.     unsigned char    *v_keybid;         
  105.     int        *v_screen_x;         
  106.     int        *v_screen_y;         
  107.     struct keybuf    *v_keybuf;         
  108.  
  109.     char        *v_mon_id;         
  110.  
  111.  
  112.     void        (*v_fwritechar)();     
  113.     int        *v_fbaddr;         
  114.     char        **v_font;         
  115.     void        (*v_fwritestr)();     
  116.  
  117.  
  118.     void        (*v_boot_me)();         
  119.  
  120.  
  121.     unsigned char    *v_linebuf;         
  122.     unsigned char    **v_lineptr;         
  123.     int        *v_linesize;         
  124.     void        (*v_getline)();         
  125.     unsigned char    (*v_getone)();         
  126.     unsigned char    (*v_peekchar)();     
  127.     int        *v_fbthere;         
  128.     int        (*v_getnum)();         
  129.  
  130.  
  131.     int        (*v_printf)();         
  132.     void        (*v_printhex)();     
  133.  
  134.     unsigned char    *v_leds;         
  135.     void        (*v_set_leds)();     
  136.  
  137.  
  138.     void        (*v_nmi)();         
  139.     void        (*v_abortent)();     
  140.     int        *v_nmiclock;         
  141.  
  142.     int        *v_fbtype;         
  143.  
  144.  
  145.     unsigned    v_romvec_version;      
  146.     struct globram    *v_gp;             
  147.     struct zscc_device     *v_keybzscc;     
  148.  
  149.     int        *v_keyrinit;         
  150.     unsigned char    *v_keyrtick;          
  151.     unsigned    *v_memoryavail;         
  152.     long        *v_resetaddr;         
  153.     long        *v_resetmap;         
  154.                          
  155.     void        (*v_exit_to_mon)();     
  156.  
  157.     unsigned char    **v_memorybitmap;     
  158.     void        (*v_setcxsegmap)();     
  159.     void        (**v_vector_cmd)();     
  160.     int        dummy1z;
  161.     int        dummy2z;
  162.     int        dummy3z;
  163.     int        dummy4z;
  164. };
  165.  
  166.  
  167.  
  168.  
  169.  
  170.  
  171.  
  172.  
  173.  
  174.  
  175.  
  176.  
  177.  
  178.  
  179.  
  180.  
  181.  
  182.  
  183.  
  184.  
  185.  
  186.  
  187.  
  188.  
  189.  
  190.  
  191.  
  192.  
  193.  
  194.  
  195.  
  196.  
  197.  
  198. struct bootparam {
  199.     char        *bp_argv[8];     
  200.     char        bp_strings[100]; 
  201.     char        bp_dev[2];     
  202.     int        bp_ctlr;     
  203.     int        bp_unit;     
  204.     int        bp_part;     
  205.     char        *bp_name;     
  206.     struct boottab    *bp_boottab;     
  207. };
  208.  
  209.  
  210.  
  211.  
  212.  
  213.  
  214.  
  215.  
  216.  
  217. struct boottab {
  218.     char    b_dev[2];         
  219.     int    (*b_probe)();         
  220.     int    (*b_boot)();         
  221.     int    (*b_open)();         
  222.     int    (*b_close)();         
  223.     int    (*b_strategy)();     
  224.     char    *b_desc;         
  225.     struct devinfo *b_devinfo;     
  226. };
  227.  
  228.  
  229. enum MAPTYPES {
  230.     MAP_MAINMEM, MAP_OBIO, MAP_MBMEM, MAP_MBIO,
  231.     MAP_VME16A16D, MAP_VME16A32D,
  232.     MAP_VME24A16D, MAP_VME24A32D,
  233.     MAP_VME32A16D, MAP_VME32A32D,
  234. };
  235.  
  236.  
  237.  
  238.  
  239.  
  240.  
  241.  
  242. struct devinfo {
  243.     unsigned    d_devbytes;     
  244.     unsigned    d_dmabytes;     
  245.     unsigned    d_localbytes;     
  246.     unsigned    d_stdcount;     
  247.     unsigned long    *d_stdaddrs;     
  248.     enum MAPTYPES     d_devtype;     
  249.     unsigned    d_maxiobytes;     
  250. };
  251.  
  252.  
  253.  
  254.  
  255.  
  256.  
  257.  
  258.  
  259.  
  260.  
  261.  
  262.  
  263.  
  264.  
  265.  
  266.  
  267.  
  268.  
  269.  
  270.  
  271.  
  272.  
  273.  
  274.  
  275.  
  276.  
  277.  
  278.  
  279.  
  280.  
  281.  
  282.  
  283.  
  284.  
  285.  
  286.  
  287.  
  288.  
  289.  
  290.  
  291.  
  292.  
  293.  
  294.  
  295.  
  296.  
  297.  
  298.  
  299.  
  300.  
  301.  
  302.  
  303.  
  304.  
  305.  
  306.  
  307.  
  308.  
  309.  
  310.  
  311.  
  312.  
  313.  
  314.  
  315.  
  316.  
  317.  
  318.  
  319.  
  320.  
  321.  
  322.  
  323.  
  324.  
  325.  
  326.  
  327.  
  328.  
  329.  
  330.  
  331.  
  332.  
  333.  
  334.  
  335.  
  336.  
  337.  
  338.  
  339.  
  340.  
  341.  
  342.  
  343.  
  344.  
  345.  
  346.  
  347.  
  348.  
  349.  
  350.  
  351.  
  352.  
  353.  
  354.  
  355.  
  356.  
  357. # 21 "boot.h"
  358.  
  359.  
  360.  
  361.  
  362.  
  363.  
  364.  
  365.  
  366.  
  367. # 10 "tftp.c"
  368.  
  369.  
  370. # 1 "sun3.md/saio.h"
  371.  
  372.  
  373.  
  374.  
  375.  
  376.  
  377.  
  378.  
  379.  
  380.  
  381.  
  382. # 1 "./types.h"
  383.  
  384.  
  385.  
  386.  
  387.  
  388.  
  389.  
  390.  
  391.  
  392.  
  393. # 1 "./systypes.h"
  394.  
  395.  
  396.  
  397.  
  398.  
  399.  
  400.  
  401.  
  402.  
  403.  
  404.  
  405.  
  406.  
  407.  
  408.  
  409.  
  410.  
  411.  
  412. typedef    unsigned char    u_char;
  413. typedef    unsigned short    u_short;
  414. typedef    unsigned int    u_int;
  415. typedef    unsigned long    u_long;
  416. typedef    unsigned short    ushort;         
  417.  
  418.  
  419.  
  420.  
  421.  
  422.  
  423.  
  424.  
  425.  
  426.  
  427.  
  428.  
  429.  
  430. typedef    struct    _quad { long val[2]; } quad;
  431. typedef    long    daddr_t;
  432. typedef    char *    caddr_t;
  433. typedef    u_long    ino_t;
  434. typedef    long    swblk_t;
  435. typedef    int    size_t;
  436. typedef    int    time_t;
  437. typedef    short    dev_t;
  438. typedef    int    off_t;
  439.  
  440. typedef    struct    fd_set { int fds_bits[1]; } fd_set;
  441.  
  442.  
  443. # 11 "./types.h"
  444.  
  445.  
  446.  
  447.  
  448.  
  449.  
  450.  
  451.  
  452.  
  453.  
  454.  
  455.  
  456.  
  457.  
  458.  
  459.  
  460.  
  461.  
  462. # 12 "sun3.md/saio.h"
  463.  
  464. # 1 "sun3.md/sunromvec.h"
  465.  
  466.  
  467.  
  468.  
  469.  
  470.  
  471.  
  472.  
  473.  
  474.  
  475.  
  476.  
  477.  
  478.  
  479.  
  480.  
  481.  
  482.  
  483.  
  484.  
  485.  
  486.  
  487.  
  488.  
  489.  
  490.  
  491.  
  492.  
  493.  
  494.  
  495.  
  496.  
  497.  
  498.  
  499.  
  500.  
  501.  
  502.  
  503.  
  504.  
  505.  
  506.  
  507.  
  508.  
  509.  
  510.  
  511.  
  512.  
  513.  
  514. struct sunromvec {
  515.     char        *v_initsp;         
  516.     void        (*v_startmon)();     
  517.     int        *v_diagberr;         
  518.  
  519.  
  520.     struct bootparam    **v_bootparam;     
  521.      unsigned    *v_memorysize;         
  522.  
  523.  
  524.     unsigned char    (*v_getchar)();         
  525.     void        (*v_putchar)();         
  526.     int        (*v_mayget)();         
  527.     int        (*v_mayput)();         
  528.     unsigned char    *v_echo;         
  529.     unsigned char    *v_insource;         
  530.     unsigned char    *v_outsink;         
  531.  
  532.  
  533.     int        (*v_getkey)();         
  534.     void        (*v_initgetkey)();     
  535.     unsigned int    *v_translation;         
  536.     unsigned char    *v_keybid;         
  537.     int        *v_screen_x;         
  538.     int        *v_screen_y;         
  539.     struct keybuf    *v_keybuf;         
  540.  
  541.     char        *v_mon_id;         
  542.  
  543.  
  544.     void        (*v_fwritechar)();     
  545.     int        *v_fbaddr;         
  546.     char        **v_font;         
  547.     void        (*v_fwritestr)();     
  548.  
  549.  
  550.     void        (*v_boot_me)();         
  551.  
  552.  
  553.     unsigned char    *v_linebuf;         
  554.     unsigned char    **v_lineptr;         
  555.     int        *v_linesize;         
  556.     void        (*v_getline)();         
  557.     unsigned char    (*v_getone)();         
  558.     unsigned char    (*v_peekchar)();     
  559.     int        *v_fbthere;         
  560.     int        (*v_getnum)();         
  561.  
  562.  
  563.     int        (*v_printf)();         
  564.     void        (*v_printhex)();     
  565.  
  566.     unsigned char    *v_leds;         
  567.     void        (*v_set_leds)();     
  568.  
  569.  
  570.     void        (*v_nmi)();         
  571.     void        (*v_abortent)();     
  572.     int        *v_nmiclock;         
  573.  
  574.     int        *v_fbtype;         
  575.  
  576.  
  577.     unsigned    v_romvec_version;      
  578.     struct globram    *v_gp;             
  579.     struct zscc_device     *v_keybzscc;     
  580.  
  581.     int        *v_keyrinit;         
  582.     unsigned char    *v_keyrtick;          
  583.     unsigned    *v_memoryavail;         
  584.     long        *v_resetaddr;         
  585.     long        *v_resetmap;         
  586.                          
  587.     void        (*v_exit_to_mon)();     
  588.  
  589.     unsigned char    **v_memorybitmap;     
  590.     void        (*v_setcxsegmap)();     
  591.     void        (**v_vector_cmd)();     
  592.     int        dummy1z;
  593.     int        dummy2z;
  594.     int        dummy3z;
  595.     int        dummy4z;
  596. };
  597.  
  598.  
  599.  
  600.  
  601.  
  602.  
  603.  
  604.  
  605.  
  606.  
  607.  
  608.  
  609.  
  610.  
  611.  
  612.  
  613.  
  614.  
  615.  
  616.  
  617.  
  618.  
  619.  
  620.  
  621.  
  622.  
  623.  
  624.  
  625.  
  626.  
  627.  
  628.  
  629.  
  630. struct bootparam {
  631.     char        *bp_argv[8];     
  632.     char        bp_strings[100]; 
  633.     char        bp_dev[2];     
  634.     int        bp_ctlr;     
  635.     int        bp_unit;     
  636.     int        bp_part;     
  637.     char        *bp_name;     
  638.     struct boottab    *bp_boottab;     
  639. };
  640.  
  641.  
  642.  
  643.  
  644.  
  645.  
  646.  
  647.  
  648.  
  649. struct boottab {
  650.     char    b_dev[2];         
  651.     int    (*b_probe)();         
  652.     int    (*b_boot)();         
  653.     int    (*b_open)();         
  654.     int    (*b_close)();         
  655.     int    (*b_strategy)();     
  656.     char    *b_desc;         
  657.     struct devinfo *b_devinfo;     
  658. };
  659.  
  660.  
  661. enum MAPTYPES {
  662.     MAP_MAINMEM, MAP_OBIO, MAP_MBMEM, MAP_MBIO,
  663.     MAP_VME16A16D, MAP_VME16A32D,
  664.     MAP_VME24A16D, MAP_VME24A32D,
  665.     MAP_VME32A16D, MAP_VME32A32D,
  666. };
  667.  
  668.  
  669.  
  670.  
  671.  
  672.  
  673.  
  674. struct devinfo {
  675.     unsigned    d_devbytes;     
  676.     unsigned    d_dmabytes;     
  677.     unsigned    d_localbytes;     
  678.     unsigned    d_stdcount;     
  679.     unsigned long    *d_stdaddrs;     
  680.     enum MAPTYPES     d_devtype;     
  681.     unsigned    d_maxiobytes;     
  682. };
  683.  
  684.  
  685.  
  686.  
  687.  
  688.  
  689.  
  690.  
  691.  
  692.  
  693.  
  694.  
  695.  
  696.  
  697.  
  698.  
  699.  
  700.  
  701.  
  702.  
  703.  
  704.  
  705.  
  706.  
  707.  
  708.  
  709.  
  710.  
  711.  
  712.  
  713.  
  714.  
  715.  
  716.  
  717.  
  718.  
  719.  
  720.  
  721.  
  722.  
  723.  
  724.  
  725.  
  726.  
  727.  
  728.  
  729.  
  730.  
  731.  
  732.  
  733.  
  734.  
  735.  
  736.  
  737.  
  738.  
  739.  
  740.  
  741.  
  742.  
  743.  
  744.  
  745.  
  746.  
  747.  
  748.  
  749.  
  750.  
  751.  
  752.  
  753.  
  754.  
  755.  
  756.  
  757.  
  758.  
  759.  
  760.  
  761.  
  762.  
  763.  
  764.  
  765.  
  766.  
  767.  
  768.  
  769.  
  770.  
  771.  
  772.  
  773.  
  774.  
  775.  
  776.  
  777.  
  778.  
  779.  
  780.  
  781.  
  782.  
  783.  
  784.  
  785.  
  786.  
  787.  
  788.  
  789. # 13 "sun3.md/saio.h"
  790.  
  791.  
  792.  
  793.  
  794.  
  795.  
  796.  
  797.  
  798.  
  799.  
  800. struct saioreq {
  801.     char    si_flgs;
  802.     struct boottab *si_boottab;     
  803.     char    *si_devdata;         
  804.     int    si_ctlr;         
  805.     int    si_unit;         
  806.     daddr_t    si_boff;         
  807.     daddr_t    si_cyloff;
  808.     off_t    si_offset;
  809.     daddr_t    si_bn;             
  810.     char    *si_ma;             
  811.     int    si_cc;             
  812.     struct    saif *si_sif;         
  813.     char     *si_devaddr;         
  814.     char    *si_dmaaddr;         
  815. };
  816.  
  817.  
  818.  
  819.  
  820.  
  821.  
  822.  
  823.  
  824.  
  825.  
  826.  
  827.  
  828.  
  829.  
  830.  
  831.  
  832.  
  833.  
  834.  
  835.  
  836.  
  837.  
  838. struct saif {
  839.     int    (*sif_xmit)();         
  840.     int    (*sif_poll)();         
  841.     int    (*sif_reset)();         
  842. };
  843.  
  844.  
  845.  
  846.  
  847. enum RESOURCES { 
  848.     RES_MAINMEM,         
  849.     RES_RAWVIRT,         
  850.     RES_DMAMEM,         
  851.     RES_DMAVIRT,         
  852. };
  853.  
  854.  
  855.  
  856.  
  857.  
  858.  
  859.  
  860.  
  861.  
  862.  
  863.  
  864.  
  865.  
  866.  
  867. # 98 "sun3.md/saio.h"
  868.  
  869.  
  870.  
  871.  
  872.  
  873.  
  874.  
  875.  
  876.  
  877.  
  878.  
  879. # 12 "tftp.c"
  880.  
  881. # 1 "socket.h"
  882.  
  883.  
  884.  
  885.  
  886.  
  887.  
  888.  
  889.  
  890.  
  891.  
  892.  
  893.  
  894.  
  895.  
  896.  
  897.  
  898.  
  899.  
  900.  
  901.  
  902.  
  903.  
  904.  
  905.  
  906.                  
  907.  
  908.  
  909.  
  910.  
  911.  
  912.  
  913.  
  914.  
  915.  
  916.  
  917.  
  918.  
  919.  
  920.  
  921.  
  922.  
  923.  
  924.  
  925.  
  926.  
  927.  
  928.  
  929.  
  930.  
  931.  
  932.  
  933. struct sockaddr {
  934.     u_short    sa_family;         
  935.     char    sa_data[14];         
  936. };
  937.  
  938.  
  939.  
  940.  
  941.  
  942. struct sockproto {
  943.     u_short    sp_family;         
  944.     u_short    sp_protocol;         
  945. };
  946.  
  947.  
  948.  
  949.  
  950.  
  951.  
  952.  
  953.  
  954.  
  955.  
  956.  
  957.  
  958.  
  959.  
  960.  
  961.  
  962.  
  963.  
  964.  
  965.  
  966.  
  967.  
  968.  
  969.  
  970.  
  971.  
  972.  
  973.  
  974.  
  975.  
  976.  
  977.  
  978. struct msghdr {
  979.     caddr_t    msg_name;         
  980.     int    msg_namelen;         
  981.     struct    iovec *msg_iov;         
  982.     int    msg_iovlen;         
  983.     caddr_t    msg_accrights;         
  984.     int    msg_accrightslen;
  985. };
  986.  
  987.  
  988.  
  989.  
  990.  
  991.  
  992. # 13 "tftp.c"
  993.  
  994. # 1 "if.h"
  995.  
  996.  
  997.  
  998.  
  999.  
  1000.  
  1001.  
  1002.  
  1003.  
  1004.  
  1005.  
  1006.  
  1007.  
  1008.  
  1009.  
  1010.  
  1011.  
  1012.  
  1013.  
  1014.  
  1015.  
  1016.  
  1017.  
  1018.  
  1019.  
  1020.  
  1021.  
  1022.  
  1023.  
  1024.  
  1025.  
  1026.  
  1027.  
  1028.  
  1029.  
  1030.  
  1031. struct ifnet {
  1032.     char    *if_name;         
  1033.     short    if_unit;         
  1034.     short    if_mtu;             
  1035.     int    if_net;             
  1036.     short    if_flags;         
  1037.     short    if_timer;         
  1038.     int    if_host[2];         
  1039.     struct    sockaddr if_addr;     
  1040.     union {
  1041.         struct    sockaddr ifu_broadaddr;
  1042.         struct    sockaddr ifu_dstaddr;
  1043.     } if_ifu;
  1044.  
  1045.  
  1046.     struct    ifqueue {
  1047.         struct    mbuf *ifq_head;
  1048.         struct    mbuf *ifq_tail;
  1049.         int    ifq_len;
  1050.         int    ifq_maxlen;
  1051.         int    ifq_drops;
  1052.     } if_snd;             
  1053.  
  1054.     int    (*if_init)();         
  1055.     int    (*if_output)();         
  1056.     int    (*if_ioctl)();         
  1057.     int    (*if_reset)();         
  1058.     int    (*if_watchdog)();     
  1059.  
  1060.     int    if_ipackets;         
  1061.     int    if_ierrors;         
  1062.     int    if_opackets;         
  1063.     int    if_oerrors;         
  1064.     int    if_collisions;         
  1065.  
  1066.     struct    ifnet *if_next;
  1067.     struct    ifnet *if_upper;     
  1068.     struct    ifnet *if_lower;     
  1069.     int    (*if_input)();         
  1070.     int    (*if_ctlin)();         
  1071.     int    (*if_ctlout)();         
  1072.  
  1073.  
  1074.  
  1075. };
  1076.  
  1077.  
  1078.  
  1079.  
  1080.  
  1081.  
  1082.  
  1083.  
  1084.  
  1085.  
  1086.  
  1087.  
  1088.  
  1089.  
  1090.  
  1091.  
  1092.  
  1093.  
  1094.  
  1095. # 109 "if.h"
  1096.  
  1097.  
  1098.  
  1099.  
  1100.  
  1101.  
  1102.  
  1103.  
  1104. # 125 "if.h"
  1105.  
  1106.  
  1107.  
  1108.  
  1109.  
  1110.  
  1111.  
  1112.  
  1113.  
  1114.  
  1115. struct    ifreq {
  1116.  
  1117.     char    ifr_name[16 ];         
  1118.     union {
  1119.         struct    sockaddr ifru_addr;
  1120.         struct    sockaddr ifru_dstaddr;
  1121.         char    ifru_oname[16 ];     
  1122.         short    ifru_flags;
  1123.         char    ifru_data[1];         
  1124.     } ifr_ifru;
  1125.  
  1126.  
  1127.  
  1128.  
  1129.  
  1130. };
  1131.  
  1132.  
  1133.  
  1134.  
  1135.  
  1136.  
  1137.  
  1138. struct    ifconf {
  1139.     int    ifc_len;         
  1140.     union {
  1141.         caddr_t    ifcu_buf;
  1142.         struct    ifreq *ifcu_req;
  1143.     } ifc_ifcu;
  1144.  
  1145.  
  1146. };
  1147.  
  1148.  
  1149.  
  1150.  
  1151. struct arpreq {
  1152.     struct sockaddr    arp_pa;         
  1153.     struct sockaddr    arp_ha;         
  1154.     int    arp_flags;         
  1155. };
  1156.  
  1157.  
  1158.  
  1159.  
  1160.  
  1161.  
  1162. # 14 "tftp.c"
  1163.  
  1164. # 1 "in.h"
  1165.  
  1166.  
  1167.  
  1168.  
  1169.  
  1170.  
  1171.  
  1172.  
  1173.  
  1174.  
  1175.  
  1176.  
  1177.  
  1178.  
  1179.  
  1180.  
  1181.  
  1182.  
  1183.  
  1184.  
  1185.  
  1186.  
  1187.  
  1188.  
  1189.  
  1190.  
  1191.  
  1192.  
  1193.  
  1194.  
  1195.  
  1196.  
  1197.  
  1198.  
  1199.  
  1200.  
  1201.  
  1202.  
  1203.  
  1204.  
  1205.  
  1206.  
  1207.  
  1208.  
  1209.  
  1210.  
  1211.  
  1212.  
  1213.  
  1214.  
  1215.  
  1216.  
  1217.  
  1218.  
  1219.  
  1220.  
  1221.  
  1222.  
  1223.  
  1224.  
  1225.  
  1226.  
  1227.  
  1228.  
  1229.  
  1230.  
  1231.  
  1232.  
  1233.  
  1234.  
  1235.  
  1236.  
  1237.  
  1238.  
  1239.  
  1240.  
  1241. struct in_addr {
  1242.     union {
  1243.         struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
  1244.         struct { u_short s_w1,s_w2; } S_un_w;
  1245.         u_long S_addr;
  1246.     } S_un;
  1247.  
  1248.  
  1249.  
  1250.  
  1251.  
  1252.  
  1253. };
  1254.  
  1255.  
  1256.  
  1257.  
  1258.  
  1259.  
  1260.  
  1261.  
  1262.  
  1263.  
  1264.  
  1265.  
  1266.  
  1267.  
  1268.  
  1269.  
  1270.  
  1271.  
  1272.  
  1273.  
  1274.  
  1275.  
  1276.  
  1277.  
  1278.  
  1279. struct sockaddr_in {
  1280.     short    sin_family;
  1281.     u_short    sin_port;
  1282.     struct    in_addr sin_addr;
  1283.     char    sin_zero[8];
  1284. };
  1285.  
  1286.  
  1287.  
  1288.  
  1289.  
  1290.  
  1291.  
  1292.  
  1293.  
  1294.  
  1295.  
  1296. # 15 "tftp.c"
  1297.  
  1298. # 1 "if_ether.h"
  1299.  
  1300.  
  1301.  
  1302.  
  1303.  
  1304.  
  1305. struct ether_addr {
  1306.     u_char    ether_addr_octet[6];
  1307. };
  1308.  
  1309.  
  1310.  
  1311.  
  1312. struct    ether_header {
  1313.     struct    ether_addr ether_dhost;
  1314.     struct    ether_addr ether_shost;
  1315.     u_short    ether_type;
  1316. };
  1317.  
  1318.  
  1319.  
  1320.  
  1321.  
  1322.  
  1323.  
  1324.  
  1325.  
  1326.  
  1327.  
  1328.  
  1329.  
  1330.  
  1331.  
  1332.  
  1333.  
  1334.  
  1335.  
  1336.  
  1337.  
  1338.  
  1339.  
  1340.  
  1341. struct    ether_arp {
  1342.     u_short    arp_hrd;     
  1343.  
  1344.     u_short    arp_pro;     
  1345.     u_char    arp_hln;     
  1346.     u_char    arp_pln;     
  1347.     u_short    arp_op;
  1348.  
  1349.  
  1350.  
  1351.  
  1352.     u_char    arp_xsha[6];     
  1353.     u_char    arp_xspa[4];     
  1354.     u_char    arp_xtha[6];     
  1355.     u_char    arp_xtpa[4];     
  1356. };
  1357.  
  1358.  
  1359.  
  1360.  
  1361.  
  1362.  
  1363.  
  1364.  
  1365.  
  1366.  
  1367. struct    arpcom {
  1368.     struct     ifnet ac_if;     
  1369.     struct ether_addr ac_enaddr;     
  1370.     struct    arpcom *ac_ac;     
  1371. };
  1372.  
  1373.  
  1374.  
  1375.  
  1376. struct    arptab {
  1377.     struct    in_addr at_iaddr;     
  1378.     struct    ether_addr at_enaddr;     
  1379.     struct    mbuf *at_hold;         
  1380.     u_char    at_timer;         
  1381.     u_char    at_flags;         
  1382. };
  1383.  
  1384. # 16 "tftp.c"
  1385.  
  1386. # 1 "in_systm.h"
  1387.  
  1388.  
  1389.  
  1390.  
  1391.  
  1392.  
  1393.  
  1394.  
  1395.  
  1396.  
  1397.  
  1398.  
  1399.  
  1400.  
  1401.  
  1402.  
  1403.  
  1404. typedef u_short n_short;         
  1405. typedef u_long    n_long;             
  1406. typedef    u_long    n_time;             
  1407.  
  1408.  
  1409. # 17 "tftp.c"
  1410.  
  1411. # 1 "ip.h"
  1412.  
  1413.  
  1414.  
  1415.  
  1416.  
  1417.  
  1418.  
  1419.  
  1420.  
  1421.  
  1422.  
  1423.  
  1424.  
  1425.  
  1426.  
  1427.  
  1428.  
  1429.  
  1430.  
  1431.  
  1432.  
  1433.  
  1434.  
  1435.  
  1436.  
  1437.  
  1438.  
  1439.  
  1440.  
  1441.  
  1442. struct ip {
  1443.  
  1444.     u_char    ip_hl:4,         
  1445.         ip_v:4;             
  1446.  
  1447.  
  1448.     u_char    ip_v:4,             
  1449.         ip_hl:4;         
  1450.  
  1451.     u_char    ip_tos;             
  1452.     short    ip_len;             
  1453.     u_short    ip_id;             
  1454.     short    ip_off;             
  1455.  
  1456.  
  1457.     u_char    ip_ttl;             
  1458.     u_char    ip_p;             
  1459.     u_short    ip_sum;             
  1460.     struct    in_addr ip_src,ip_dst;     
  1461. };
  1462.  
  1463.  
  1464.  
  1465.  
  1466.  
  1467.  
  1468.  
  1469.  
  1470.  
  1471.  
  1472.  
  1473.  
  1474.  
  1475.  
  1476.  
  1477.  
  1478.  
  1479.  
  1480.  
  1481.  
  1482.  
  1483.  
  1484.  
  1485.  
  1486.  
  1487.  
  1488.  
  1489.  
  1490.  
  1491.  
  1492.  
  1493.  
  1494.  
  1495.  
  1496.  
  1497.  
  1498. struct    ip_timestamp {
  1499.     u_char    ipt_code;         
  1500.     u_char    ipt_len;         
  1501.     u_char    ipt_ptr;         
  1502.  
  1503.     u_char    ipt_flg:4,         
  1504.         ipt_oflw:4;         
  1505.  
  1506.  
  1507.     u_char    ipt_oflw:4,         
  1508.         ipt_flg:4;         
  1509.  
  1510.     union ipt_timestamp {
  1511.         n_long    ipt_time[1];
  1512.         struct    ipt_ta {
  1513.             struct in_addr ipt_addr;
  1514.             n_long ipt_time;
  1515.         } ipt_ta[1];
  1516.     } ipt_timestamp;
  1517. };
  1518.  
  1519.  
  1520.  
  1521.  
  1522.  
  1523.  
  1524.  
  1525.  
  1526.  
  1527.  
  1528.  
  1529.  
  1530.  
  1531.  
  1532.  
  1533.  
  1534.  
  1535.  
  1536.  
  1537.  
  1538.  
  1539.  
  1540.  
  1541.  
  1542.  
  1543. # 18 "tftp.c"
  1544.  
  1545. # 1 "udp.h"
  1546.  
  1547.  
  1548.  
  1549.  
  1550.  
  1551.  
  1552.  
  1553. struct udphdr {
  1554.     u_short    uh_sport;         
  1555.     u_short    uh_dport;         
  1556.     short    uh_ulen;         
  1557.     u_short    uh_sum;             
  1558. };
  1559. # 19 "tftp.c"
  1560.  
  1561. # 1 "sainet.h"
  1562.  
  1563.  
  1564.  
  1565.  
  1566.  
  1567.  
  1568.  
  1569.  
  1570.  
  1571.  
  1572. struct sainet {
  1573.     struct in_addr    sain_myaddr;     
  1574.     struct ether_addr sain_myether;     
  1575.     struct in_addr    sain_hisaddr;     
  1576.     struct ether_addr sain_hisether; 
  1577. };
  1578. # 20 "tftp.c"
  1579.  
  1580. # 1 "sun3.md/sunromvec.h"
  1581.  
  1582.  
  1583.  
  1584.  
  1585.  
  1586.  
  1587.  
  1588.  
  1589.  
  1590.  
  1591.  
  1592.  
  1593.  
  1594.  
  1595.  
  1596.  
  1597.  
  1598.  
  1599.  
  1600.  
  1601.  
  1602.  
  1603.  
  1604.  
  1605.  
  1606.  
  1607.  
  1608.  
  1609.  
  1610.  
  1611.  
  1612.  
  1613.  
  1614.  
  1615.  
  1616.  
  1617.  
  1618.  
  1619.  
  1620.  
  1621.  
  1622.  
  1623.  
  1624.  
  1625.  
  1626.  
  1627.  
  1628.  
  1629.  
  1630. struct sunromvec {
  1631.     char        *v_initsp;         
  1632.     void        (*v_startmon)();     
  1633.     int        *v_diagberr;         
  1634.  
  1635.  
  1636.     struct bootparam    **v_bootparam;     
  1637.      unsigned    *v_memorysize;         
  1638.  
  1639.  
  1640.     unsigned char    (*v_getchar)();         
  1641.     void        (*v_putchar)();         
  1642.     int        (*v_mayget)();         
  1643.     int        (*v_mayput)();         
  1644.     unsigned char    *v_echo;         
  1645.     unsigned char    *v_insource;         
  1646.     unsigned char    *v_outsink;         
  1647.  
  1648.  
  1649.     int        (*v_getkey)();         
  1650.     void        (*v_initgetkey)();     
  1651.     unsigned int    *v_translation;         
  1652.     unsigned char    *v_keybid;         
  1653.     int        *v_screen_x;         
  1654.     int        *v_screen_y;         
  1655.     struct keybuf    *v_keybuf;         
  1656.  
  1657.     char        *v_mon_id;         
  1658.  
  1659.  
  1660.     void        (*v_fwritechar)();     
  1661.     int        *v_fbaddr;         
  1662.     char        **v_font;         
  1663.     void        (*v_fwritestr)();     
  1664.  
  1665.  
  1666.     void        (*v_boot_me)();         
  1667.  
  1668.  
  1669.     unsigned char    *v_linebuf;         
  1670.     unsigned char    **v_lineptr;         
  1671.     int        *v_linesize;         
  1672.     void        (*v_getline)();         
  1673.     unsigned char    (*v_getone)();         
  1674.     unsigned char    (*v_peekchar)();     
  1675.     int        *v_fbthere;         
  1676.     int        (*v_getnum)();         
  1677.  
  1678.  
  1679.     int        (*v_printf)();         
  1680.     void        (*v_printhex)();     
  1681.  
  1682.     unsigned char    *v_leds;         
  1683.     void        (*v_set_leds)();     
  1684.  
  1685.  
  1686.     void        (*v_nmi)();         
  1687.     void        (*v_abortent)();     
  1688.     int        *v_nmiclock;         
  1689.  
  1690.     int        *v_fbtype;         
  1691.  
  1692.  
  1693.     unsigned    v_romvec_version;      
  1694.     struct globram    *v_gp;             
  1695.     struct zscc_device     *v_keybzscc;     
  1696.  
  1697.     int        *v_keyrinit;         
  1698.     unsigned char    *v_keyrtick;          
  1699.     unsigned    *v_memoryavail;         
  1700.     long        *v_resetaddr;         
  1701.     long        *v_resetmap;         
  1702.                          
  1703.     void        (*v_exit_to_mon)();     
  1704.  
  1705.     unsigned char    **v_memorybitmap;     
  1706.     void        (*v_setcxsegmap)();     
  1707.     void        (**v_vector_cmd)();     
  1708.     int        dummy1z;
  1709.     int        dummy2z;
  1710.     int        dummy3z;
  1711.     int        dummy4z;
  1712. };
  1713.  
  1714.  
  1715.  
  1716.  
  1717.  
  1718.  
  1719.  
  1720.  
  1721.  
  1722.  
  1723.  
  1724.  
  1725.  
  1726.  
  1727.  
  1728.  
  1729.  
  1730.  
  1731.  
  1732.  
  1733.  
  1734.  
  1735.  
  1736.  
  1737.  
  1738.  
  1739.  
  1740.  
  1741.  
  1742.  
  1743.  
  1744.  
  1745.  
  1746. struct bootparam {
  1747.     char        *bp_argv[8];     
  1748.     char        bp_strings[100]; 
  1749.     char        bp_dev[2];     
  1750.     int        bp_ctlr;     
  1751.     int        bp_unit;     
  1752.     int        bp_part;     
  1753.     char        *bp_name;     
  1754.     struct boottab    *bp_boottab;     
  1755. };
  1756.  
  1757.  
  1758.  
  1759.  
  1760.  
  1761.  
  1762.  
  1763.  
  1764.  
  1765. struct boottab {
  1766.     char    b_dev[2];         
  1767.     int    (*b_probe)();         
  1768.     int    (*b_boot)();         
  1769.     int    (*b_open)();         
  1770.     int    (*b_close)();         
  1771.     int    (*b_strategy)();     
  1772.     char    *b_desc;         
  1773.     struct devinfo *b_devinfo;     
  1774. };
  1775.  
  1776.  
  1777. enum MAPTYPES {
  1778.     MAP_MAINMEM, MAP_OBIO, MAP_MBMEM, MAP_MBIO,
  1779.     MAP_VME16A16D, MAP_VME16A32D,
  1780.     MAP_VME24A16D, MAP_VME24A32D,
  1781.     MAP_VME32A16D, MAP_VME32A32D,
  1782. };
  1783.  
  1784.  
  1785.  
  1786.  
  1787.  
  1788.  
  1789.  
  1790. struct devinfo {
  1791.     unsigned    d_devbytes;     
  1792.     unsigned    d_dmabytes;     
  1793.     unsigned    d_localbytes;     
  1794.     unsigned    d_stdcount;     
  1795.     unsigned long    *d_stdaddrs;     
  1796.     enum MAPTYPES     d_devtype;     
  1797.     unsigned    d_maxiobytes;     
  1798. };
  1799.  
  1800.  
  1801.  
  1802.  
  1803.  
  1804.  
  1805.  
  1806.  
  1807.  
  1808.  
  1809.  
  1810.  
  1811.  
  1812.  
  1813.  
  1814.  
  1815.  
  1816.  
  1817.  
  1818.  
  1819.  
  1820.  
  1821.  
  1822.  
  1823.  
  1824.  
  1825.  
  1826.  
  1827.  
  1828.  
  1829.  
  1830.  
  1831.  
  1832.  
  1833.  
  1834.  
  1835.  
  1836.  
  1837.  
  1838.  
  1839.  
  1840.  
  1841.  
  1842.  
  1843.  
  1844.  
  1845.  
  1846.  
  1847.  
  1848.  
  1849.  
  1850.  
  1851.  
  1852.  
  1853.  
  1854.  
  1855.  
  1856.  
  1857.  
  1858.  
  1859.  
  1860.  
  1861.  
  1862.  
  1863.  
  1864.  
  1865.  
  1866.  
  1867.  
  1868.  
  1869.  
  1870.  
  1871.  
  1872.  
  1873.  
  1874.  
  1875.  
  1876.  
  1877.  
  1878.  
  1879.  
  1880.  
  1881.  
  1882.  
  1883.  
  1884.  
  1885.  
  1886.  
  1887.  
  1888.  
  1889.  
  1890.  
  1891.  
  1892.  
  1893.  
  1894.  
  1895.  
  1896.  
  1897.  
  1898.  
  1899.  
  1900.  
  1901.  
  1902.  
  1903.  
  1904.  
  1905. # 21 "tftp.c"
  1906.  
  1907. # 1 "sun3.md/cpu.addrs.h"
  1908.  
  1909.  
  1910.  
  1911.  
  1912.  
  1913.  
  1914.  
  1915.  
  1916.  
  1917.  
  1918.  
  1919.  
  1920.  
  1921.  
  1922.  
  1923.  
  1924.  
  1925.  
  1926.  
  1927.  
  1928.  
  1929.  
  1930.  
  1931.  
  1932.  
  1933.  
  1934.  
  1935.  
  1936.  
  1937.  
  1938.  
  1939.  
  1940.  
  1941.  
  1942.  
  1943.  
  1944.  
  1945.  
  1946.  
  1947.  
  1948.  
  1949.  
  1950.  
  1951.  
  1952.  
  1953.  
  1954.  
  1955.  
  1956.  
  1957.  
  1958.  
  1959.  
  1960.  
  1961.  
  1962.  
  1963.  
  1964.  
  1965.  
  1966.  
  1967.  
  1968.  
  1969.  
  1970.  
  1971.  
  1972.  
  1973.  
  1974.  
  1975.  
  1976.  
  1977.  
  1978.  
  1979.  
  1980.  
  1981.  
  1982.  
  1983.  
  1984.  
  1985.  
  1986.  
  1987.  
  1988.  
  1989.  
  1990.  
  1991.  
  1992.  
  1993.  
  1994.  
  1995.  
  1996.  
  1997.  
  1998.  
  1999.  
  2000.  
  2001.  
  2002.  
  2003.  
  2004.  
  2005.  
  2006.  
  2007.  
  2008.  
  2009.  
  2010.  
  2011.  
  2012.  
  2013.  
  2014.  
  2015.  
  2016.  
  2017.  
  2018.  
  2019.  
  2020.  
  2021.  
  2022.  
  2023.  
  2024.  
  2025.  
  2026.  
  2027.  
  2028.  
  2029.  
  2030.  
  2031.  
  2032.  
  2033.  
  2034.  
  2035.  
  2036.  
  2037.  
  2038.  
  2039.  
  2040.  
  2041. # 22 "tftp.c"
  2042.  
  2043.  
  2044.  
  2045. # 1 "tftp.h"
  2046.  
  2047.  
  2048.  
  2049.  
  2050.  
  2051.  
  2052.  
  2053.  
  2054.  
  2055.  
  2056.  
  2057.  
  2058.  
  2059.  
  2060.  
  2061.  
  2062.  
  2063.  
  2064.  
  2065.  
  2066.  
  2067. struct    tftphdr {
  2068.     short    th_opcode;         
  2069.     union {
  2070.         short    tu_block;     
  2071.         short    tu_code;     
  2072.         char    tu_stuff[1];     
  2073.     } th_u;
  2074.     char    th_data[1];         
  2075. };
  2076.  
  2077.  
  2078.  
  2079.  
  2080.  
  2081.  
  2082.  
  2083.  
  2084.  
  2085.  
  2086.  
  2087.  
  2088.  
  2089.  
  2090.  
  2091.  
  2092.  
  2093. # 25 "tftp.c"
  2094.  
  2095.  
  2096. # 1 "/sprite/lib/include/sun3.md/sys/exec.h"
  2097.  
  2098.  
  2099.  
  2100.  
  2101.  
  2102.  
  2103.  
  2104.  
  2105.  
  2106.  
  2107.  
  2108.  
  2109.  
  2110.  
  2111. struct exec {
  2112.     unsigned short    a_machtype;     
  2113.     unsigned short    a_magic;     
  2114.     unsigned long    a_text;         
  2115.     unsigned long    a_data;         
  2116.     unsigned long    a_bss;         
  2117.     unsigned long    a_syms;         
  2118.     unsigned long    a_entry;     
  2119.     unsigned long    a_trsize;     
  2120.     unsigned long    a_drsize;     
  2121. };
  2122.  
  2123.  
  2124.  
  2125.  
  2126.  
  2127.  
  2128.  
  2129.  
  2130.  
  2131.  
  2132.  
  2133.  
  2134.  
  2135.  
  2136.  
  2137.  
  2138.  
  2139.  
  2140.  
  2141.  
  2142. # 27 "tftp.c"
  2143.  
  2144.  
  2145. char    *tftp_errs[] = {
  2146.     "not defined",
  2147.     "file not found",
  2148.     "access violation",
  2149.     "disk full or allocation exceeded",
  2150.     "illegal TFTP operation",
  2151.     "unknown transfer ID",
  2152.     "file already exists",
  2153.     "no such user"
  2154. };
  2155.  
  2156.  
  2157.  
  2158. struct tftp_pack {     
  2159.     struct ether_header tf_ether;     
  2160.     struct ip tf_ip;         
  2161.     struct udphdr tf_udp;         
  2162.     struct tftphdr tf_tftp;         
  2163.     char tftp_data[    512        ];     
  2164. };
  2165.  
  2166.  
  2167.  
  2168.  
  2169.  
  2170.  
  2171.  
  2172. struct tftpglob {
  2173.     struct tftp_pack tf_out;     
  2174.     struct sainet tf_inet;         
  2175.     char    tf_tmpbuf[1600];     
  2176.     int    tf_block;         
  2177.     char    *tf_data;         
  2178. };
  2179.  
  2180.  
  2181.  
  2182.  
  2183.  
  2184. tftpload(sip, bp)
  2185.     register struct saioreq *sip;
  2186.     struct bootparam *bp;
  2187. {
  2188.     register struct tftpglob *tf = ((struct tftpglob *)(    (0xb4000 -0x4000 )  + 0x3000)) ;
  2189.     register struct tftp_pack *out = &tf->tf_out;
  2190.     register struct tftp_pack *in = (struct tftp_pack *)tf->tf_tmpbuf;
  2191.     register char *p, *q, *x;
  2192.     register short i, len;
  2193.     int autoboot = 0;
  2194.     int firsttry = 0;
  2195.     int feedback = 0;
  2196.     int finished = 0;
  2197.     int time, xcount, locked, retry;
  2198.     struct exec *header;
  2199.     char      *ind = "-=";
  2200.     
  2201.  
  2202.  
  2203.  
  2204.  
  2205.  
  2206.      
  2207.  
  2208.  
  2209.     out->tf_ip.ip_v = 4 ;
  2210.     out->tf_ip.ip_hl = sizeof (struct ip) / 4;
  2211.     out->tf_ip.ip_ttl =     255        ;
  2212.     out->tf_ip.ip_p =     17        ;
  2213.     out->tf_udp.uh_sport =  ((*((struct sunromvec *)0x0FEF0000) ->v_nmiclock)  & 1023) + 1024;
  2214.     out->tf_udp.uh_dport =      69 ;
  2215.     out->tf_udp.uh_sum =  0;         
  2216.     
  2217.      
  2218.  
  2219.  
  2220.  
  2221.     out->tf_ip.ip_src = tf->tf_inet.sain_myaddr;
  2222.     
  2223. # 120 "tftp.c"
  2224.  
  2225.       (*((struct sunromvec *)0x0FEF0000) ->v_printf) ("Downloading \"%s\" from tftp server at ", bp->bp_name); 
  2226.     inet_print(out->tf_ip.ip_dst);
  2227.  
  2228.     
  2229.     ++firsttry;
  2230.     locked = 0;
  2231.     retry = 0;
  2232.     tf->tf_block = 1;
  2233.     tf->tf_data = (char *)0x4000  - sizeof(struct exec);;
  2234.     
  2235.      
  2236.  
  2237.  
  2238.     out->tf_tftp.th_opcode = 01            ;
  2239.     p = out->tf_tftp.th_u.tu_stuff ;
  2240.     q = bp->bp_name;
  2241.     while (*p++ = *q++) {
  2242.       ;
  2243.     }
  2244.     q = "octet";
  2245.     while (*p++ = *q++)
  2246.     ;
  2247.     out->tf_udp.uh_ulen = sizeof (struct udphdr) + 2 +
  2248.     (p - out->tf_tftp.th_u.tu_stuff );
  2249.     out->tf_ip.ip_len = sizeof (struct ip) +
  2250.     out->tf_udp.uh_ulen;
  2251.     
  2252.     time = 0;
  2253.     for (xcount = 0; xcount < 5;) {
  2254.     if ((*((struct sunromvec *)0x0FEF0000) ->v_nmiclock)  - time >= 4000    ) {
  2255.         time = (*((struct sunromvec *)0x0FEF0000) ->v_nmiclock) ;
  2256.          
  2257.  
  2258.  
  2259.           (*((struct sunromvec *)0x0FEF0000) ->v_printf) ("X\b?\b");
  2260.         if (ip_output(sip, (caddr_t)out, out->tf_ip.ip_len +
  2261.               sizeof (struct ether_header), &tf->tf_inet,
  2262.               tf->tf_tmpbuf))
  2263.           (*((struct sunromvec *)0x0FEF0000) ->v_printf) ("X\b");
  2264.         if (locked == 0 || retry > 15)
  2265.         xcount++;
  2266.         else 
  2267.         retry++;
  2268.     }
  2269.     len = ip_input(sip, (caddr_t)in, &tf->tf_inet);
  2270.     if (len < (sizeof (struct ether_header) + sizeof (struct ip) + sizeof (struct udphdr) + 4) )
  2271.         continue;
  2272.     if (in->tf_ip.ip_p !=     17         ||
  2273.         in->tf_udp.uh_dport != out->tf_udp.uh_sport) 
  2274.         continue;
  2275.     if (locked &&
  2276.         out->tf_ip.ip_dst.S_un.S_addr     != in->tf_ip.ip_src.S_un.S_addr    )
  2277.     {
  2278.           (*((struct sunromvec *)0x0FEF0000) ->v_printf) ("bogus packet from ");
  2279.         inet_print(in->tf_ip.ip_src);
  2280.         continue;
  2281.     }
  2282.     if (in->tf_tftp.th_opcode == 05            ) {
  2283.         if (autoboot && tf->tf_block == 1)
  2284.         continue;
  2285.         if (in->tf_tftp.    th_u.tu_code  < 0 ||
  2286.         in->tf_tftp.    th_u.tu_code  > sizeof(tftp_errs)/sizeof(char *)){
  2287.               (*((struct sunromvec *)0x0FEF0000) ->v_printf) ("tftp: Unknown error 0x%x\n",
  2288.                in->tf_tftp.    th_u.tu_code );
  2289.         } else {
  2290.           (*((struct sunromvec *)0x0FEF0000) ->v_printf) ("tftp: %s @ block %d\n",
  2291.                tftp_errs[in->tf_tftp.    th_u.tu_code ], tf->tf_block);
  2292.         }
  2293.  
  2294.  
  2295.  
  2296.  
  2297.         return (-1);
  2298.     }
  2299.     if (in->tf_tftp.th_opcode != 03            ) {
  2300.           (*((struct sunromvec *)0x0FEF0000) ->v_printf) ("unhandled opcode %d\n", in->tf_tftp.th_opcode);
  2301.         continue;
  2302.     } else if (in->tf_tftp.th_u.tu_block  != tf->tf_block) {
  2303.           (*((struct sunromvec *)0x0FEF0000) ->v_printf) ("expected block %d, got %d\n", tf->tf_block,
  2304.            in->tf_tftp.th_u.tu_block );
  2305.          
  2306.  
  2307.  
  2308.  
  2309.         if (in->tf_tftp.th_u.tu_block  == tf->tf_block - 1) {
  2310.         xcount = retry = 0;
  2311.         out->tf_tftp.th_opcode = 04            ;
  2312.         out->tf_tftp.th_u.tu_block  = in->tf_tftp.th_u.tu_block ;
  2313.         out->tf_udp.uh_ulen = sizeof(struct udphdr) + 4;
  2314.         out->tf_ip.ip_len = sizeof(struct ip) + out->tf_udp.uh_ulen;
  2315.         time = (*((struct sunromvec *)0x0FEF0000) ->v_nmiclock) ;
  2316.         if (ip_output(sip, (caddr_t)out,
  2317.                   out->tf_ip.ip_len + sizeof(struct ether_header),
  2318.                   &tf->tf_inet, tf->tf_tmpbuf))
  2319.         {
  2320.               (*((struct sunromvec *)0x0FEF0000) ->v_printf) ("X\b");
  2321.         }
  2322.         }
  2323.         continue;
  2324.     }
  2325.     
  2326.      
  2327.  
  2328.  
  2329.     if (tf->tf_block == 1) {     
  2330.         out->tf_udp.uh_dport = in->tf_udp.uh_sport;
  2331.  
  2332.  
  2333.  
  2334.  
  2335.         locked = 1;
  2336.     }
  2337.      
  2338.  
  2339.  
  2340.     len = in->tf_udp.uh_ulen - (sizeof(struct udphdr) + 4);
  2341.     if (len) {
  2342.         bcopy(in->tf_tftp.th_data, tf->tf_data, len);
  2343.         if (tf->tf_block == 1) {
  2344.         header = (struct exec *)tf->tf_data;
  2345.           (*((struct sunromvec *)0x0FEF0000) ->v_printf) ("Size: %d", header->a_text);
  2346.         }
  2347.         tf->tf_data += len;
  2348.  
  2349.         if (header->a_text) {
  2350.         header->a_text -= len;
  2351.         if (tf->tf_block == 1) {
  2352.              
  2353.  
  2354.  
  2355.  
  2356.             header->a_text += sizeof(struct exec);
  2357.         }
  2358.         if ((int)header->a_text <= 0) {
  2359.               (*((struct sunromvec *)0x0FEF0000) ->v_printf) ("+%d", header->a_data);
  2360.             header->a_data += header->a_text;
  2361.             header->a_text = 0;
  2362.         }
  2363.         } else {
  2364.         header->a_data -= len;
  2365.         if ((int)header->a_data <= 0) {
  2366.               (*((struct sunromvec *)0x0FEF0000) ->v_printf) ("+%d\n", header->a_bss);
  2367.             finished = 1;
  2368.         }
  2369.         }
  2370.     }
  2371.     if ((tf->tf_block & 0xf) == 1) {
  2372.           (*((struct sunromvec *)0x0FEF0000) ->v_printf) ("%c\b", ind[feedback++ & 1]);     
  2373.     }
  2374.      
  2375.  
  2376.  
  2377.     xcount = 0;
  2378.     retry = 0;
  2379.     out->tf_tftp.th_opcode = (!finished ? 04             : 05            );
  2380.     out->tf_tftp.th_u.tu_block  = tf->tf_block++;
  2381.     out->tf_udp.uh_ulen = sizeof (struct udphdr) + 4;
  2382.     out->tf_ip.ip_len = sizeof (struct ip) + out->tf_udp.uh_ulen;
  2383.     time = (*((struct sunromvec *)0x0FEF0000) ->v_nmiclock) ;
  2384.     if (ip_output(sip, (caddr_t)out, out->tf_ip.ip_len +
  2385.               sizeof (struct ether_header), &tf->tf_inet,
  2386.               tf->tf_tmpbuf))
  2387.           (*((struct sunromvec *)0x0FEF0000) ->v_printf) ("X\b");
  2388.     if ((len <     512        ) || finished) {     
  2389.          
  2390.  
  2391.  
  2392.  
  2393.         tf->tf_data += (int)header->a_data;
  2394.         bzero(tf->tf_data, header->a_bss);
  2395.         
  2396.           (*((struct sunromvec *)0x0FEF0000) ->v_printf) ("Downloaded %d bytes from tftp server.\n\n",
  2397.            tf->tf_data - 0x4000 );
  2398.         return (0x4000 );
  2399.     }
  2400.     }
  2401.       (*((struct sunromvec *)0x0FEF0000) ->v_printf) ("tftp: time-out.\n");
  2402.  
  2403.  
  2404.  
  2405.  
  2406.     return (-1);
  2407. }
  2408.  
  2409.  
  2410.  
  2411.  
  2412.  
  2413.  
  2414.  
  2415. struct ether_addr etherbroadcastaddr = { 
  2416.     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  2417. };
  2418.  
  2419. struct arp_packet {
  2420.     struct ether_header    arp_eh;
  2421.     struct ether_arp    arp_ea;
  2422.  
  2423.     char    filler[(60-14)  - sizeof(struct ether_arp)];
  2424. };
  2425.  
  2426.  
  2427.  
  2428.  
  2429.  
  2430.  
  2431.  
  2432.  
  2433. arp(sip, sain, tmpbuf)
  2434.     register struct saioreq *sip;
  2435.     register struct sainet *sain;
  2436.     char *tmpbuf;
  2437. {
  2438.     struct arp_packet out;
  2439.  
  2440.     if (in_lnaof(sain->sain_hisaddr) == 0x00000000  ||
  2441.         (in_lnaof(sain->sain_hisaddr) &     0x000000ff ) ==     0x000000ff ) {
  2442.         sain->sain_hisether = etherbroadcastaddr;
  2443.         return;
  2444.     }
  2445.     out.arp_eh.ether_type = 0x0806        ;
  2446.     out.arp_ea.arp_op = 1    ;
  2447.     (*(struct ether_addr *)(&out.arp_ea)->arp_xtha)  = etherbroadcastaddr;     
  2448.     (*(struct in_addr *)(&out.arp_ea)->arp_xtpa) .S_un.S_addr     = sain->sain_hisaddr.S_un.S_addr    ;
  2449.     comarp(sip, sain, &out, tmpbuf);
  2450. }
  2451.  
  2452.  
  2453.  
  2454.  
  2455.  
  2456.  
  2457. comarp(sip, sain, out, tmpbuf)
  2458.     register struct saioreq *sip;
  2459.     register struct sainet *sain;
  2460.     register struct arp_packet *out;
  2461.     char *tmpbuf;
  2462. {
  2463.     register struct arp_packet *in = (struct arp_packet *)tmpbuf;
  2464.     register int e, count, time, feedback,len, delay = 2;
  2465.     char    *ind = "-\\|/";
  2466.  
  2467.     out->arp_eh.ether_dhost = etherbroadcastaddr;
  2468.     out->arp_eh.ether_shost = sain->sain_myether;
  2469.     out->arp_ea.arp_hrd =      1    ;
  2470.     out->arp_ea.arp_pro =     0x0800        ;
  2471.     out->arp_ea.arp_hln = sizeof(struct ether_addr);
  2472.     out->arp_ea.arp_pln = sizeof(struct in_addr);
  2473.     (*(struct ether_addr *)(&out->arp_ea)->arp_xsha)  = sain->sain_myether;
  2474.     (*(struct in_addr *)(&out->arp_ea)->arp_xspa) .S_un.S_addr     = sain->sain_myaddr.S_un.S_addr    ;
  2475.     feedback = 0;
  2476.  
  2477.     for (count=0; ; count++) {
  2478.         if (count == 2    ) {
  2479.             if (out->arp_ea.arp_op == 1    ) {
  2480.                   (*((struct sunromvec *)0x0FEF0000) ->v_printf) ("Requesting Ethernet address for ");
  2481.                 inet_print((*(struct in_addr *)(&out->arp_ea)->arp_xtpa) );
  2482.             } else {
  2483.                   (*((struct sunromvec *)0x0FEF0000) ->v_printf) ("Requesting Internet address for ");
  2484.                 ether_print(&(*(struct ether_addr *)(&out->arp_ea)->arp_xtha) );
  2485.             }
  2486.         }
  2487.         e = (*sip->si_sif->sif_xmit)(sip->si_devdata, (caddr_t)out,
  2488.             sizeof *out);
  2489.         
  2490.         time = (*((struct sunromvec *)0x0FEF0000) ->v_nmiclock)  + (delay * 1000);     
  2491.           (*((struct sunromvec *)0x0FEF0000) ->v_printf) ("%c\b", ind[feedback++ % 4]);     
  2492.  
  2493.         while ((*((struct sunromvec *)0x0FEF0000) ->v_nmiclock)  <= time) {
  2494.             len = (*sip->si_sif->sif_poll)(sip->si_devdata, tmpbuf);
  2495.             if (len < (sizeof (struct ether_header)+sizeof(struct ether_arp)) )
  2496.                 continue;
  2497.             if (in->arp_ea.arp_pro !=     0x0800        )
  2498.                 continue;
  2499.             if (out->arp_ea.arp_op == 1    ) {
  2500.                 if (in->arp_eh.ether_type != 0x0806        )
  2501.                     continue;
  2502.                 if (in->arp_ea.arp_op != 2    )
  2503.                     continue;
  2504.                 if ((*(struct in_addr *)(&in->arp_ea)->arp_xspa) .S_un.S_addr     !=
  2505.                     (*(struct in_addr *)(&out->arp_ea)->arp_xtpa) .S_un.S_addr    )
  2506.                     continue;
  2507.                 if (count >= 2    ) {
  2508.                       (*((struct sunromvec *)0x0FEF0000) ->v_printf) ("Found at ");
  2509.                     ether_print(&(*(struct ether_addr *)(&in->arp_ea)->arp_xsha) );
  2510.                 }
  2511.                 sain->sain_hisether = (*(struct ether_addr *)(&in->arp_ea)->arp_xsha) ;
  2512.                 return;
  2513.             } else {         
  2514.                 if (in->arp_eh.ether_type !=0x8035        )
  2515.                     continue;
  2516.                 if (in->arp_ea.arp_op != 4    )
  2517.                     continue;
  2518.                 if (bcmp((caddr_t)&(*(struct ether_addr *)(&in->arp_ea)->arp_xtha) ,
  2519.                     (caddr_t)&(*(struct ether_addr *)(&out->arp_ea)->arp_xtha) , 
  2520.                     sizeof (struct ether_addr)) != 0)
  2521.                     continue;
  2522.  
  2523.                   (*((struct sunromvec *)0x0FEF0000) ->v_printf) ("Using IP Address ");
  2524.                 inet_print((*(struct in_addr *)(&in->arp_ea)->arp_xtpa) );
  2525.  
  2526.                 sain->sain_myaddr = (*(struct in_addr *)(&in->arp_ea)->arp_xtpa) ;
  2527.                  
  2528.                 sain->sain_hisaddr = (*(struct in_addr *)(&in->arp_ea)->arp_xspa) ;
  2529.                 sain->sain_hisether = (*(struct ether_addr *)(&in->arp_ea)->arp_xsha) ;
  2530.                 return;
  2531.             }
  2532.         }
  2533.         delay = delay * 2;     
  2534.  
  2535.         if (delay > 64)         
  2536.             delay = 64;
  2537.  
  2538.         (*sip->si_sif->sif_reset)(sip->si_devdata);
  2539.     }
  2540.      
  2541. }
  2542.  
  2543.  
  2544.  
  2545.  
  2546.  
  2547. ip_output(sip, buf, len, sain, tmpbuf)
  2548.     register struct saioreq *sip;
  2549.     caddr_t buf, tmpbuf;
  2550.     short len;
  2551.     register struct sainet *sain;
  2552. {
  2553.     register struct ether_header *eh;
  2554.     register struct ip *ip;
  2555.  
  2556.     eh = (struct ether_header *)buf;
  2557.     ip = (struct ip *)(buf + sizeof(struct ether_header));
  2558.     if (ip->ip_dst.S_un.S_addr     != sain->sain_hisaddr.S_un.S_addr    ) {
  2559.         sain->sain_hisaddr.S_un.S_addr     = ip->ip_dst.S_un.S_addr    ;
  2560.         arp(sip, sain, tmpbuf);
  2561.     }
  2562.     eh->ether_type =     0x0800        ;
  2563.     eh->ether_shost = sain->sain_myether;
  2564.     eh->ether_dhost = sain->sain_hisether;
  2565.      
  2566.     ip->ip_sum = 0;
  2567.     ip->ip_sum = ipcksum((caddr_t)ip, sizeof (struct ip));
  2568.     if (len < (60-14) +sizeof(struct ether_header))
  2569.         len = (60-14) +sizeof(struct ether_header);
  2570.     return (*sip->si_sif->sif_xmit)(sip->si_devdata, buf, len);
  2571. }
  2572.  
  2573.  
  2574.  
  2575.  
  2576.  
  2577.  
  2578.  
  2579. ip_input(sip, buf, sain)
  2580.     register struct saioreq *sip;
  2581.     caddr_t buf;
  2582.     register struct sainet *sain;
  2583. {
  2584.     register short len;
  2585.     register struct ether_header *eh;
  2586.     register struct ip *ip;
  2587.     register struct ether_arp *ea;
  2588.  
  2589.     len = (*sip->si_sif->sif_poll)(sip->si_devdata, buf);
  2590.     eh = (struct ether_header *)buf;
  2591.     if (eh->ether_type ==     0x0800         &&
  2592.         len >= sizeof(struct ether_header)+sizeof(struct ip)) {
  2593.         ip = (struct ip *)(buf + sizeof(struct ether_header));
  2594.         if (ip->ip_dst.S_un.S_addr     != sain->sain_myaddr.S_un.S_addr    ) 
  2595.             return (0);
  2596.         return (len);
  2597.     }
  2598.     if (eh->ether_type == 0x0806         &&
  2599.         len >= sizeof(struct ether_header)+sizeof(struct ether_arp)) {
  2600.         ea = (struct ether_arp *)(buf + sizeof(struct ether_header));
  2601.         if (ea->arp_pro !=     0x0800        ) 
  2602.             return (0);
  2603.         if ((*(struct in_addr *)(ea)->arp_xspa) .S_un.S_addr     == sain->sain_hisaddr.S_un.S_addr    )
  2604.             sain->sain_hisether = (*(struct ether_addr *)(ea)->arp_xsha) ;
  2605.         if (ea->arp_op == 1     &&
  2606.             (*(struct in_addr *)(ea)->arp_xtpa) .S_un.S_addr     == sain->sain_myaddr.S_un.S_addr    ) {
  2607.             ea->arp_op = 2    ;
  2608.             eh->ether_dhost = (*(struct ether_addr *)(ea)->arp_xsha) ;
  2609.             eh->ether_shost = sain->sain_myether;
  2610.             (*(struct ether_addr *)(ea)->arp_xtha)  = (*(struct ether_addr *)(ea)->arp_xsha) ;
  2611.             (*(struct in_addr *)(ea)->arp_xtpa)  = (*(struct in_addr *)(ea)->arp_xspa) ;
  2612.             (*(struct ether_addr *)(ea)->arp_xsha)  = sain->sain_myether;
  2613.             (*(struct in_addr *)(ea)->arp_xspa)  = sain->sain_myaddr;
  2614.             (*sip->si_sif->sif_xmit)(sip->si_devdata, buf, 
  2615.                         sizeof(struct arp_packet));
  2616.         }
  2617.         return (0);
  2618.     }
  2619.     return (0);
  2620. }
  2621.  
  2622.  
  2623.  
  2624.  
  2625. in_lnaof(in)
  2626.     struct in_addr in;
  2627. {
  2628.     register u_long i = (in.S_un.S_addr    ) ;
  2629.  
  2630.     if (    ((((long)(i))&0x80000000)==0) )
  2631.         return ((i)&    0x00ffffff );
  2632.     else if (    ((((long)(i))&0xc0000000)==0x80000000) )
  2633.         return ((i)&    0x0000ffff );
  2634.     else
  2635.         return ((i)&    0x000000ff );
  2636. }
  2637.  
  2638.  
  2639.  
  2640.  
  2641.  
  2642. ipcksum(cp, count)
  2643.     caddr_t    cp;
  2644.     register unsigned short    count;
  2645. {
  2646.     register unsigned short    *sp = (unsigned short *)cp;
  2647.     register unsigned long    sum = 0;
  2648.     register unsigned long    oneword = 0x00010000;
  2649.  
  2650.     count >>= 1;
  2651.     while (count--) {
  2652.         sum += *sp++;
  2653.         if (sum >= oneword) {         
  2654.             sum -= oneword;
  2655.             sum++;
  2656.         }
  2657.     }
  2658.     return (~sum);
  2659. }
  2660.  
  2661. inet_print(s)
  2662.     struct in_addr s;
  2663. {
  2664.     int    len = 2;
  2665.  
  2666.       (*((struct sunromvec *)0x0FEF0000) ->v_printf) ("%d.%d.%d.%d = ", s.S_un.S_un_b.s_b1, s.S_un.S_un_b.s_b2,
  2667.         s.S_un.S_un_b.s_b3, s.S_un.S_un_b.s_b4);
  2668.  
  2669.      (*((struct sunromvec *)0x0FEF0000) ->v_printhex) (s.S_un.S_un_b.s_b1, len);
  2670.      (*((struct sunromvec *)0x0FEF0000) ->v_printhex) (s.S_un.S_un_b.s_b2, len);
  2671.      (*((struct sunromvec *)0x0FEF0000) ->v_printhex) (s.S_un.S_un_b.s_b3, len);
  2672.      (*((struct sunromvec *)0x0FEF0000) ->v_printhex) (s.S_un.S_un_b.s_b4, len);
  2673.       (*((struct sunromvec *)0x0FEF0000) ->v_printf) ("\n");
  2674. }
  2675.  
  2676. ether_print(ea)
  2677.     struct ether_addr *ea;
  2678. {
  2679.     register u_char *p = &ea->ether_addr_octet[0];
  2680.  
  2681.       (*((struct sunromvec *)0x0FEF0000) ->v_printf) ("%x:%x:%x:%x:%x:%x\n", p[0], p[1], p[2], p[3], p[4], p[5]);
  2682. }
  2683.